#推导式
# 推导式是Python中提供了一个非常方便的功能，
# 可以让我们通过一行代码实现创建list、dict、tuple、set 的同时初始化一些值。

# 对列表的初始化
# list=[i for i in range(10)]
# print(list)
#
# 结合三元运算对列表进行初始化
# list=[i for i in range(10) if i%2==0]
# print(list)


#对集合的初始化
# num_set1 = { i for i in range(10)}
# print(num_set1)
# num_set2 = { (i,i,i) for i in range(10)}
# print(num_set2)
# num_set3 = { (i,i,i) for i in range(10) if i%2==0 }
# print(num_set3)

#对字典进行初始化
# num_dict1 = { i:i for i in range(10)}
# print(num_dict1)
# num_dict2 = { i:(i,11) for i in range(10)}
# print(num_dict2)
# num_dict3 = { i:(i,11) for i in range(10) if i>7}
# print(num_dict3)

#对元组进行初始化
# 元组，不同于其他类型。
# 不会立即执行内部循环去生成数据，而是得到一个生成器对象。
# data = (i for i in range(10))
# print(data)
# for item in data:
#     print(item,end=" ")

# def func(num):
#     return num + 100
#
# data_list = [func(i) for i in range(10)]
# print(data_list)


# def func(x):
#     return x + i
# data_list = [func for i in range(10)]
# val = data_list[0](100)
# print(val)
#会报错
#
# data_list = [lambda x: i + x for i in range(10)]
# v1 = data_list[0](100)
# v2 = data_list[3](100)
# print(v1, v2)
# 这里的关键在于，所有的 lambda 函数都共享同一个外部作用域中的变量 i。当这些 lambda 被定义时，
# 它们并没有立即获取当前迭代中 i 的值，而是记录了对外部变量 i 的引用。
# 因此，在后续调用这些 lambda 时，实际使用的将是最后一次循环结束后 i 的最终值（在这个例子中是 9）

#推导式支持嵌套
# poker_list = [ (color,num) for num in range(1,14) for color in ["红桃", "黑桃", "方片", "梅花"]]
#
# print(poker_list)

# def num():
#     return [lambda x: i * x for i in range(4)]
#
# # 1. num()并获取返回值  [函数,函数,函数,函数] i=3 ,即就是相同的函数和相同的i
# # 2. for循环返回值
# # 3. 给每个函数传参都是2
# result = [m(2) for m in num()]  # [6,6,6,6]
# print(result)

# def num():
#     return (lambda x: i * x for i in range(4))
#
# # 1. num()并获取返回值,生成器对象
# # 2. for循环返回值
# # 3. 返回值的每个元素(2)
# result = [m(2) for m in num()]  # [0,2,4,6 ]
# print(result)

# 生成器对象是通过生成器函数或生成器表达式创建的对象，能够在迭代过程中逐步生成值，而不是一次性将所有值存储在内存中。

def num():
    return [lambda x: i * x for i in range(4)]

result = [m(2) for m in num()]  # [6,6,6,6 ]
print(result)